OWASP Top 10 並非一個詳盡無遺的漏洞清單,而是一個基於廣泛數據和社群共識的「風險意識文件」。它評估風險的維度通常包括:漏洞的普遍性、可檢測性、技術衝擊以及業務影響。
風險評估公式: 風險 (Risk) = 可能性 (Likelihood) × 衝擊 (Impact)。OWASP Top 10 中的項目都是高可能性且高衝擊的風險交集。
演化性: Top 10 列表會隨著技術堆疊、攻擊趨勢和防禦能力的演進而變化。例如,舊版中的 CSRF 由於現代框架和瀏覽器 SameSite Cookie 策略的普及,其風險排名已下降;而「伺服器端請求偽造 (SSRF)」和「軟體與資料完整性故障」等新興威脅則被納入。
作為溝通工具: 在專業環境中,OWASP Top 10 是安全團隊與開發團隊、管理層之間溝通的共同語言。引用 OWASP 標準可以增加漏洞報告的權威性和修復的優先級。
OWASP Top 10 不僅僅是一個漏洞列表,它更像是一份資安界的「高風險意識文件」。它由全球數千名安全專家、研究人員和企業貢獻的數據統計而成,反映了當前 Web 應用程式所面臨的最嚴重、最普遍的威脅。理解它,就是理解現代 Web 攻擊的主要脈絡。
我們以最新的 OWASP Top 10 2021 版本為基礎,進行深度剖析:
OWASP Top 10
失效的存取控制 (Broken Access Control)
深層描述:
這個風險類別從 2017 年的第五位躍升至第一位,這反映了一個核心趨勢:現代應用程式的複雜性急劇增加,但開發者對權限控管的疏忽卻最為普遍。失效的存取控制本質上是「授權 (Authorization)」的失敗。它意味著攻擊者可以執行他們本不應被允許的操作。這不僅僅是管理員 vs. 普通用戶的問題,而是滲透到應用的每一個角落。
攻擊場景剖析:
不安全的直接物件引用 (IDOR): 這是最經典的水平權限提升。例如,API 端點 GET /api/v1/userdata?id=12345,攻擊者僅需修改 id 參數,就能遍歷獲取所有用戶的資料。這源於後端未能驗證發起請求的用戶是否有權查看目標 id 的資料。
URL/路由強制瀏覽: 攻擊者作為普通用戶登入後,直接在瀏覽器中輸入只有管理員可見的 URL 路徑,如 /admin/system-logs。如果後端路由沒有實施基於角色的權限檢查中介軟體,攻擊者就能直接訪問該功能。
HTTP 方法權限錯誤: 一個普通用戶可能只能透過 GET 方法查看某個資源,但後端 API 卻忘記對 POST、PUT 或 DELETE 方法實施同樣的權限檢查,導致普通用戶可以非法修改或刪除資源。
思維模型: 測試存取控制時,我的核心思維應該是「絕不信任前端」。前端UI隱藏的按鈕或功能,後端 API 必須要有同樣的、甚至更嚴格的權限驗證。每一個需要權限的端點,都必須獨立驗證當前用戶的身份和角色。
密碼學失效 (Cryptographic Failures)
深層描述:
這個類別的前身是「敏感資訊洩漏」(Sensitive Data Exposure),名稱的改變強調了問題的根源——不是洩漏本身,而是導致洩漏的「密碼學應用的失敗」。它涵蓋了數據在傳輸 (in-transit) 和靜止 (at-rest) 狀態下的所有加密與雜湊問題。
攻擊場景剖析:
傳輸中未加密: 網站部分頁面(特別是登入頁面)未使用 HTTPS,或雖然使用了 HTTPS,但允許降級到 HTTP。攻擊者可利用中間人攻擊 (MITM) 進行 SSL 剝離 (SSL Stripping),竊聽明文傳輸的帳號密碼。
弱加密演算法: 仍在使用過時且已被證明不安全的 TLS 1.0/1.1 協定,或使用弱加密套件 (Cipher Suites)。
密碼儲存不當:
明文儲存: 最糟糕的情況。
僅 Base64 編碼: 這完全不是加密。
使用弱雜湊函數: 如 MD5 或 SHA1,這些演算法的碰撞已被輕易實現,容易受到彩虹表攻擊。
未使用「鹽」(Salt): 即使使用強雜湊,如果沒有為每個密碼加鹽,相同的密碼會產生相同的雜湊值,攻擊者仍可用預先計算好的彩虹表進行破解。
思維模型: 密碼學應用的原則是「不要自己造輪子」。始終使用經過業界驗證的、最新的標準函式庫和協議。對於密碼儲存,必須使用如 Bcrypt, Scrypt, 或 Argon2 這類專為密碼設計的、計算成本高昂的雜湊函數。
注入 (Injection)
深層描述:
雖然 SQL 注入 (SQLi) 是最著名的例子,但這個類別涵蓋了所有將不受信任的數據作為指令或查詢的一部分傳遞給解析器的場景。儘管防禦技術已經很成熟,但由於開發框架的多樣性和開發者的疏忽,注入漏洞依然普遍存在。
攻擊場景剖析:
SQL 注入: 如前所述,包括帶內、盲注、帶外等多種類型。
NoSQL 注入: 針對 MongoDB 等資料庫,攻擊者可以注入查詢運算子(如 $where, $gt)來繞過認證或洩漏資料。
作業系統命令注入 (OS Command Injection): 當應用程式需要呼叫底層系統命令,並將用戶輸入作為參數拼接時發生。例如 ping [user_input],攻擊者可輸入 8.8.8.8; ls -la 來執行額外指令。
跨網站指令碼 (XSS): 2021 版將 XSS 歸類為注入的一種,因為其本質是將惡意腳本「注入」到網頁中,並由瀏覽器解析執行。
思維模型: 防禦注入的黃金法則是「嚴格分離資料與指令」。對於 SQL,這意味著永遠使用參數化查詢 (Parameterized Queries / Prepared Statements)。對於其他解析器,則需要使用安全的 API,並對輸入進行嚴格的白名單驗證。
不安全的設計 (Insecure Design)
深層描述:
這是一個全新的類別,強調了許多漏洞的根源並非來自程式碼實現的錯誤,而是來自於「設計之初就缺乏安全思維」。它關注的是應用程式的業務邏輯和架構層面的缺陷。這類問題通常無法單靠修補程式碼來解決,而需要重新設計流程。
攻擊場景剖析:
業務邏輯濫用: 一個電商網站的優惠券功能,設計上沒有限制單一用戶的使用次數,導致攻擊者可以無限次使用同一張優惠券。
密碼重設流程缺陷: 密碼重設功能僅驗證用戶名,然後將重設連結發送到帳戶關聯的郵箱。如果攻擊者可以發動大規模請求,可能導致對目標用戶的郵件轟炸 (DoS),或者如果系統設計不當,可能存在枚舉用戶的風險。
缺乏速率限制 (Rate Limiting): 任何有價值的操作,如登入嘗試、發送驗證碼、API 請求,如果沒有設計速率限制,就容易受到暴力破解或資源濫用攻擊。
思維模型: 這個類別要求我在測試時不僅要像個駭客,更要像個產品經理和架構師。我需要問:「這個功能在設計上,可以如何被惡意地濫用?」這需要進行威脅建模 (Threat Modeling)。
安全設定錯誤 (Security Misconfiguration)
深層描述:
這個風險涵蓋了從底層作業系統、Web 伺服器、框架到應用程式本身的所有配置問題。現代應用的部署極其複雜,任何一個環節的錯誤配置都可能打開風險的大門。
攻擊場景剖析:
雲端儲存權限過大: 最常見的例子就是 AWS S3 儲存桶被設定為公開讀取或寫入。
冗長的伺服器標頭: HTTP 回應中的 Server: Apache/2.4.29 (Ubuntu) 或 X-Powered-By: PHP/7.4.3 標頭洩漏了精確的版本號,攻擊者可直接查找對應版本的已知 CVE 漏洞。
顯示詳細的錯誤訊息: 生產環境中向用戶顯示了包含程式碼堆疊追蹤 (Stack Trace)、資料庫查詢語句或內部檔案路徑的錯誤訊息。
使用預設帳號密碼: 部署了新的服務(如 Jenkins, RabbitMQ)卻忘記修改預設的管理員密碼。
思維模型: 我的測試 checklist 中必須包含一個標準的「安全基線」(Security Baseline) 檢查清單。同時,要善用自動化工具進行掃描,並養成「預設拒絕」(Deny by default) 的配置習慣。
脆弱和過時的元件 (Vulnerable and Outdated Components)
深層描述:
現代軟體開發是建立在無數開源函式庫和第三方元件之上的。你的應用程式的安全性,取決於其中最脆弱的那個元件。這個風險類別強調了「軟體供應鏈」安全的重要性。
攻擊場景剖析:
Log4Shell (CVE-2021-44228): 這是史上影響最廣泛的漏洞之一。無數 Java 應用程式因為使用了存在漏洞的 Log4j 元件而面臨遠端程式碼執行風險。
NPM 套件劫持: 攻擊者可能透過各種手段(如域名過期、帳號盜用)控制一個流行的 NPM 套件,並在其中植入惡意程式碼。所有使用該套件的專案都會被感染。
思維模型: 安全工作不再只是審查自己寫的程式碼。必須使用 SCA (軟體組成分析, Software Composition Analysis) 工具,持續掃描專案的依賴樹,及時發現並更新存在已知漏洞的元件。
A07:2021 - 識別和認證失敗 (Identification and Authentication Failures)
深層描述:
這個類別合併了之前版本中的「失效的身份認證」。它涵蓋了確認用戶身份 (你是誰) 和管理用戶會話 (記住你是誰) 的所有環節。
攻擊場景剖析:
允許憑證填充 (Credential Stuffing): 登入介面沒有帳號鎖定、MFA 或 IP 速率限制,使得攻擊者可以使用從別處洩漏的密碼庫進行大規模自動化登入嘗試。
弱密碼策略: 系統允許用戶設置如 123456 或 password 這樣的弱密碼。
會話 ID 未失效: 用戶登出後,其會話 ID 在伺服器端並未被銷毀,攻擊者若竊取了該 ID 仍可重用。
URL 中的會話 ID: http://example.com/page?sessionid=... 這種方式極其危險,會話 ID 容易透過瀏覽器歷史、日誌、Referer 標頭等洩漏。
思維模型: 身份認證是安全的第一道大門。現代應用應預設啟用 MFA。所有會話 ID 的管理必須在伺服器端嚴格執行,並透過設置了 Secure 和 HttpOnly 屬性的 Cookie 進行傳輸。
A08:2021 - 軟體和資料完整性故障 (Software and Data Integrity Failures)
深層描述:
這是一個較新的、關注軟體供應鏈和 CI/CD (持續整合/持續部署) 流程的類別。它關注的是程式碼和資料在整個生命週期中,其完整性是否遭到破壞。
攻擊場景剖析:
不安全的反序列化 (Insecure Deserialization): 應用程式反序列化了不受信任的數據,可能導致遠端程式碼執行。這是資料完整性故障的典型例子。
CI/CD 流程遭入侵: 攻擊者入侵了你的 Jenkins 或 GitHub Actions,在建構 (build) 過程中向應用程式碼中注入了後門。
未驗證軟體更新: 應用程式從一個不安全的來源下載並執行更新,而沒有對更新包進行數位簽章驗證。
思維模型: 我需要將安全視野從單一應用擴展到整個開發運維 (DevSecOps) 流程。確保程式碼來源可靠、建構環境安全、部署產物經過驗證,是防禦此類攻擊的關鍵。
A09:2021 - 安全記錄和監控失敗 (Security Logging and Monitoring Failures)
深層描述:
俗話說:「沒有日誌的入侵,就等於沒有發生過」。這個類別強調,即使你的應用程式有漏洞被利用了,如果你沒有足夠的日誌和監控,你可能永遠都無法發現攻擊、評估損失、以及追溯攻擊源。
攻擊場景剖析:
日誌不足: 應用程式沒有記錄失敗的登入嘗試、高權限操作、或存取控制失敗等關鍵安全事件。
日誌格式不當: 日誌記錄了敏感資訊(如密碼、Session ID),或者格式混亂,難以被 SIEM (安全資訊與事件管理) 系統解析。
缺乏告警: 雖然記錄了日誌,但沒有配置任何自動化告警。例如,當一個帳號在一分鐘內登入失敗 100 次時,安全團隊沒有收到任何通知。
思維模型: 日誌和監控是安全體系的「眼睛」。有效的日誌記錄應該能夠回答:誰 (Who) 在什麼時間 (When) 從哪裡 (Where) 做了什麼 (What)。
伺服器端請求偽造 (Server-Side Request Forgery - SSRF)
深層描述:
SSRF 因其在雲端環境中的巨大破壞力而首次獨立進入 Top 10。它允許攻擊者強迫伺服器代表他們,向攻擊者選擇的任意目標發起網路請求。
攻擊場景剖析:
掃描內部網路: 攻擊者利用 SSRF 漏洞,將請求目標指向內部 IP 地址段(如 10.0.0.0/8),從而探測企業內網的拓撲和開放的服務。
攻擊內部服務: 伺服器通常可以訪問內部未經嚴格認證的服務,如開發用的 Redis、Elasticsearch。攻擊者可藉此讀寫數據或執行命令。
竊取雲端服務憑證: 在 AWS、GCP 等雲環境中,虛擬機可以透過訪問一個特殊的本地元數據地址 (如 169.254.169.254) 來獲取自身的臨時憑證。這是 SSRF 最危險的利用場景,一旦憑證失竊,攻擊者可能接管你的整個雲端帳戶。
OWASP Top 10 主要關注應用程式層面的漏洞。一個完全符合 OWASP Top 10 所有防禦建議的應用程式,是否就意味著它是絕對安全的?有哪些類型的威脅是 Top 10 沒有覆蓋到的?